package serviceWeb;

import java.io.IOException;
import java.io.InputStream;
import java.sql.SQLException;
import java.util.List;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.restlet.data.CharacterSet;
import org.restlet.data.MediaType;
import org.restlet.data.Status;
import org.restlet.ext.xml.DomRepresentation;
import org.restlet.representation.Representation;
import org.restlet.representation.StringRepresentation;
import org.restlet.resource.Get;
import org.restlet.resource.ServerResource;
import org.w3c.dom.Document;
import org.xml.sax.SAXException;

/**
 * Ressource permettant de renvoyer l'ensemble des tables d'une base de données
 */
public class BaseResource extends ServerResource {
 

  EchangeBDXML base;
  /** Representation retournée */
  Representation resultat;
  /** Erreurs possibles */
  List<String> erreurs;

  /** Initialisation de la ressource a partir de la chaine d'url
   */
  protected void init() {

    String nomBD = getRequest().getAttributes().get("nomBD").toString();

    try
    {
        base = new serviceWeb.modelePostgreSQL.EchangeBDXML();
        base.getToutesLesTables(nomBD);
    }
    catch (SQLException exc) {
      setStatus(Status.SERVER_ERROR_INTERNAL);
      resultat = new StringRepresentation(exc.getMessage());
      exc.printStackTrace();
    }
  }

  /** Représentation XML (en UTF8) en réponse à une requête GET.
   * <br/>
   * Retour possible : 200, 401 avec idNotInteger, 404, 500 (si
   * problème avec la BD)
   */
  @Get
  public Representation doGet() {
    init();
    if (getStatus() == Status.SUCCESS_OK) {
      // Pas encore d'erreur => base existe
      assert base.getXML() != null;
      try
      {
        DomRepresentation dom = new DomRepresentation(MediaType.TEXT_XML);

        InputStream binaryStream = base.getXML().getBinaryStream();

        DocumentBuilder parser = DocumentBuilderFactory.newInstance().newDocumentBuilder();
        Document doc = parser.parse(binaryStream);

        dom.setDocument(doc);
      
        // Encodage en UTF-8
        dom.setCharacterSet(CharacterSet.UTF_8);
        resultat = dom;
      }
      catch (IOException exc) {
        setStatus(Status.SERVER_ERROR_INTERNAL);
        exc.printStackTrace();
      }
      catch (SQLException exc) {
          setStatus(Status.SERVER_ERROR_INTERNAL);
          resultat = new StringRepresentation(exc.getCause().getMessage());
          exc.printStackTrace();
      }
      catch (ParserConfigurationException exc) {
          setStatus(Status.SERVER_ERROR_INTERNAL);
          resultat = new StringRepresentation(exc.getMessage());
          exc.printStackTrace();
      }
      catch (SAXException exc) {
          setStatus(Status.SERVER_ERROR_INTERNAL);
          resultat = new StringRepresentation(exc.getMessage());
          exc.printStackTrace();
      }
    }
    return resultat;
  }

}
